package com.deer.wms.inventory.service;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.deer.wms.inventory.model.Inventory.*;
import com.deer.wms.inventory.model.stockTake.StockTakeMaster;
import com.deer.wms.project.root.service.SuperService;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
import java.util.Set;


/**
 *
 * @author 郭靖勋
 * @since 2019/12/18
 */
public interface InventoryService extends SuperService<Inventory> {
    /**
     * 按照条件查找满足条件的库存
     * @param criteria 条件
     * @return List<InventoryDto>
     */
    List<InventoryDto> findList(InventoryCriteria criteria);

    /**
     * 库存有效期预警查询
     * @param criteria 条件
     * @return List<InventoryEarlyDto>
     */
    List<InventoryEarlyDto> inventoryEarlyList(InventoryEarlyCriteria criteria);

    /**
     * 库存预警状态需要赋值
     * @param list 需要赋值的页面数据
     * @return List<InventoryEarlyDto>
     */
//    List<InventoryEarlyDto> insertEarlyState(List<InventoryEarlyDto> list);
    /**
     * 库存有效期预警导出方法
     * @param  response     查询条件
     * @since  1.0
     * @deprecated
     */
    void exportExcel(HttpServletResponse response, Integer organizationId, String itemCode, String itemName, String cellCode, String batchName,String boxCode,String startTime,String endTime,Integer earlyState) throws Exception;

    /**
     * 按条件查询相同库存
     * @param wareId 仓库
     * @param cellCode 库位
     * @param boxCode 箱码
     * @param packDetailId 包装
     * @param itemCode 物料
     * @param batchId 批次
     * @param transRatio 转换率
     * @return Inventory
     */
    Inventory getSameInventory(Integer wareId, String cellCode, String boxCode, Integer packDetailId, String itemCode, Integer batchId, Double transRatio);

    /**
     * 按条件查询相同库存
     * @param wareId 仓库
     * @param cellCode 库位
     * @param boxCode 箱码
     * @param packDetailId 包装
     * @param itemCode 物料
     * @param batchName 批次
     * @param transRatio 转换率
     * @return Inventory
     */
    Inventory getSameInventoryNew(Integer wareId, String cellCode, String boxCode, Integer packDetailId, String itemCode, String batchName, Double transRatio);
    /**
     * 获取收货区库存
     * @param inventoryId 库存ID
     * @param wareId 仓库ID
     * @return Inventory
     */
    Inventory  getAccept(Integer inventoryId,Integer wareId);

    List<InventoryDto> findByCellUseType(InventoryCriteria criteria);

    List<InventorySelectDto> findByInventoryId(InventoryCriteria criteria);

    /**
     * 根据条件查询可出库库存
     * @param criteria 条件
     * @return List<InventorySelectDto>
     */
    List<InventorySelectDto> findCanBeOutOfStock(InventoryCriteria criteria);

    /**
     * 查询待出库的库存
     * @param criteria criteria
     * @return List<InventoryToOutDto>
     */
    List<InventoryToOutDto> findToOutStock(InventoryCriteria criteria);

    /**
     * 查询待上架的库存
     * @param criteria criteria
     * @return List<InventoryToUpperDto>
     */
    List<InventoryToUpperDto> findToUpperStock(InventoryCriteria criteria);

    List<InventoryDto> canOut(InventoryCriteria criteria);

    List<Inventory> findSame(InventoryCriteria criteria);

    List<Inventory> findByCellCode(InventoryCriteria criteria);

    List<Inventory> findByCellCodeAndState(InventoryCriteria criteria);

    List<Inventory> checkList(InventoryCriteria criteria);

    List<Inventory>findBatchInventory(InventoryCriteria criteria);

    Inventory findBatchId(Integer batchId);


    List inventorySafetyList(InventoryCriteria criteria);

    List<Inventory> palletsToCombine(InventoryCriteria criteria);

    List<Inventory> inventoriesWithBoxCode(String boxCode);

    List<InventoryDto> inventoriesForOut(String boxCode);

    List<GroupByWareOrgItem> findGroupByWareOrgItem(InventoryCriteria criteria);

    String findSameItemCell(String itemCode,Integer wareId,Integer orgId);

    /**
     * 按单出库
     * @param billNo 单据号
     * @param wareId 仓库id
     */
    void sendOut(String billNo,Integer wareId);

    List<Inventory> getInventoryByFromInfo(StockTakeMaster stockTakeMaster);

    Inventory findBy(String field, Integer value);

    List<Inventory> findListByField(String field, String value);

    /**
     * 获取库位上的容器数量
     * @param cellCode
     * @return
     */
    Integer getBoxNumInCell(String cellCode);

    List<Inventory> selectItemByCodes(String cellCode, String boxCode);

    void updateInOrOut(Integer wareId, String itemCode, Double residualQuantity, String in);


    Double findAllStock(Integer wareId);

    Integer findAllSKUs(Integer wareId);

    double findAllStockCells(Integer wareId);

    List<Inventory> getTopSku(Integer wareId, int i);
}
